package com.boarsoft.boar.proj.action;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.boarsoft.bean.ReplyInfo;
import com.boarsoft.boar.common.Constants;
import com.boarsoft.boar.dir.action.TreeAction;
import com.boarsoft.boar.dir.bean.DirTreeNode;
import com.boarsoft.boar.entity.DirInfo;
import com.boarsoft.boar.entity.ProjInfo;
import com.boarsoft.boar.proj.ProjBiz;
import com.boarsoft.common.Authorized;
import com.boarsoft.common.Util;
import com.boarsoft.common.dao.PagedResult;
import com.boarsoft.common.util.JsonUtil;

@RestController
@RequestMapping("/proj")
public class ProjAction extends TreeAction {
	@Autowired
	private ProjBiz projBiz;

	/**
	 * 分页查询所有的Proj
	 * 
	 * @return
	 */
	@RequestMapping("/list.do")
	@Authorized(code = "proj.list")
	public ReplyInfo<Object> list(String parentId, String key, String orderBy, int pageNo, int pageSize) {
		PagedResult<ProjInfo> pr = projBiz.list(key, orderBy, pageNo, pageSize);
		return new ReplyInfo<Object>(true, pr);
	}
	
	@RequestMapping("/save.do")
	@Authorized(code = "proj.save")
	public ReplyInfo<Object> save(ProjInfo p) {
		if (Util.strIsEmpty(p.getId())){
			return this.add(p);
		}
		return this.update(p);
	}

	/**
	 * 新增一个系统/工程信息，需要根据参数parentId查出其放置的目录 ，然后保存至dir_info表，再保存系统信息proj_info
	 * 
	 * @return
	 */
	@RequestMapping("/add.do")
	@Authorized(code = "proj.add")
	public ReplyInfo<Object> add(ProjInfo p) {
		DirInfo d = new DirInfo();
		d.setCode(p.getCode());
		d.setId(p.getId());
		d.setMemo(p.getMemo());
		d.setName(p.getName());
		d.setParentId(p.getParentId());
		d.setStatus(p.getStatus());
		d.setType(DirInfo.TYPE_PROJ);
		ReplyInfo<Object> ro = super.add(d);
		if (!ro.isSuccess()) {
			return new ReplyInfo<Object>(true, ro.getData());
		}
		p.setCreateTime(Util.getStdmfDateTime());
		p.setLastTime(Util.getStdmfDateTime());
		ro = projBiz.add(d, p);// 此方法将完成相关数据的处理，详见说明
		if (ro.isSuccess()) {
			DirTreeNode dtn = new DirTreeNode((DirInfo) ro.getData());
			return new ReplyInfo<Object>(true, dtn);
		}
		return new ReplyInfo<Object>(ro.getData());
	}

	/**
	 * 新增一个系统/工程信息，需要根据参数parentId查出其放置的目录 ，然后保存至dir_info表，再保存系统信息proj_info
	 * 
	 * @return
	 */
	@RequestMapping("/update.do")
	@Authorized(code = "proj.update")
	public ReplyInfo<Object> update(ProjInfo p) {
		DirInfo d = new DirInfo();
		d.setId(p.getId());
		d.setCode(p.getCode());
		d.setName(p.getName());
		d.setMemo(p.getMemo());
		ReplyInfo<Object> ro = super.update(d);
		if (!ro.isSuccess()) {
			return new ReplyInfo<Object>(true, String.valueOf(ro.getData()));
		}
		ProjInfo a = projBiz.get(p.getId());
		if (a == null) {
			return new ReplyInfo<Object>(Constants.ERROR_NOTFOUND, "Msg.common.project");
		}
		a.setCode(p.getCode());
		a.setName(p.getName());
		a.setSourcePath(p.getSourcePath());
		a.setVer(p.getVer());
		a.setSourceCode(p.getSourceCode());// 应用源码在svn上的路径
		a.setExportCode(p.getExportCode());// 应用源码在svn上的路径
		a.setCompileCode(p.getCompileCode());// 应用源码在svn上的路径
		a.setDeployCode(p.getDeployCode());// 应用源码在svn上的路径
		// if (Util.strIsNotEmpty("" + p.getStatus)) {// status非常规修改逻辑
		a.setStatus(p.getStatus());
		// }
		a.setMemo(p.getMemo());
		a.setLastTime(Util.getStdmfDateTime());
		a.setPackingAddr(p.getPackingAddr());
		// update方法需判断code是否改变，一旦改变，需修改子节点的path
		ro = projBiz.update(d, a);
		if (ro.isSuccess()) {
			DirTreeNode dtn = new DirTreeNode((DirInfo) ro.getData());
			return new ReplyInfo<Object>(true, JsonUtil.from(dtn));
		}
		return new ReplyInfo<Object>(String.valueOf(ro.getData()));
	}

	@RequestMapping("/get.do")
	@Authorized(code = "proj.get")
	public String get(String id) {
		ProjInfo o = projBiz.get(id);
		return JsonUtil.from(new ReplyInfo<String>(true, JsonUtil.from(o)));
	}

	/**
	 * 仅当不用树管理时使用
	 * 
	 * @return
	 */
	@RequestMapping("/delete.do")
	@Authorized(code = "proj.delete")
	public ReplyInfo<Object> delete(String id) {
		projBiz.delete(id);
		return ReplyInfo.SUCCESS;
	}

	/**
	 * 启用系统 根据id更新proj_info,dir_info表，设置status为 1 （status-应用状态：0：停用，1：启用 ）
	 * 支持批量用多个系统，多个系统id用英文逗号分隔
	 * 
	 * @return
	 */
	@RequestMapping("/start.do")
	@Authorized(code = "proj.start")
	public ReplyInfo<Object> start(String ids) {
		if (projBiz.start(ids)) {
			return ReplyInfo.SUCCESS;
		}
		return Constants.REPLY_WARN_INVALID;
	}

	/**
	 * 停用系统 根据id更新proj_info,dir_info表，设置status为 0 （status-应用状态：0：停用，1：启用 ）
	 * 支持批量停用多个系统，多个应用id用英文逗号分隔
	 * 
	 * @return
	 */
	@RequestMapping("/stop.do")
	@Authorized(code = "proj.stop")
	public ReplyInfo<Object> stop(String ids) {
		if (projBiz.stop(ids)) {
			return ReplyInfo.SUCCESS;
		}
		return Constants.REPLY_WARN_INVALID;
	}
}